#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e4+10;
int n,m,stac[MAXN],top;
struct node
{
	int fa,c[2];
	bool rev;
}a[MAXN];
bool isroot(int o)
{
	return a[a[o].fa].c[0]!=o&&a[a[o].fa].c[1]!=o;
}
void push_down(int o)
{
	if(a[o].rev)
	{
		a[a[o].c[0]].rev^=1;
		a[a[o].c[1]].rev^=1;
		a[o].rev=0;
		swap(a[o].c[0],a[o].c[1]);
	}
	return;
}
void rotate(int x)
{
	int y=a[x].fa,z=a[y].fa,dy=a[y].c[1]==x,dz=a[z].c[1]==y;
	if(!isroot(y))a[z].c[dz]=x;
	a[y].c[dy]=a[x].c[dy^1];
	a[a[x].c[dy^1]].fa=y;
	a[x].c[dy^1]=y;
	a[y].fa=x;
	a[x].fa=z;
	return;
}
void splay(int x)
{
	stac[top=1]=x;
	for(int i=x;!isroot(i);i=a[i].fa)
		stac[++top]=a[i].fa;
	while(top)push_down(stac[top--]);
	while(!isroot(x))
	{
		int y=a[x].fa,z=a[y].fa;
		if(!isroot(y))
		{
			if(a[y].c[1]==x^a[z].c[1]==y)rotate(x);
			else rotate(y);
		}
		rotate(x);
	}
	return;
}
void access(int o)
{
	for(int i=0;o;i=o,o=a[o].fa)
	{
		splay(o);
		a[o].c[1]=i;
	}
	return;
}
void makeroot(int o)
{
	access(o);
	splay(o);
	a[o].rev^=1;
	return;
}
int findroot(int o)
{
	access(o);
	splay(o);
	while(a[o].c[0])o=a[o].c[0];
	return o;
}
void link(int x,int y)
{
	makeroot(x);
	a[x].fa=y;
	return;
}
void cut(int x,int y)
{
	makeroot(x);
	access(y);
	splay(y);
	a[y].c[0]=a[x].fa=0;
	return;
}
int main()
{
	scanf("%d%d",&n,&m);
	while(m--)
	{
		char t1[10];
		int t2,t3;
		scanf("%s",t1);
		scanf("%d%d",&t2,&t3);
		if(t1[0]=='Q')
		{
			if(findroot(t2)==findroot(t3))puts("Yes");
			else puts("No");
		}
		else if(t1[0]=='C')link(t2,t3);
		else cut(t2,t3);
	}
	return 0;
}
